#include <string>


template<typename T>
struct Useless
{
    T inner;
};


template<typename T>
struct expose_template_type< Useless<T> > : 
    public expose_template_type_base< Useless<T> >
{
    typedef expose_template_type_base< Useless<T> > base_type;
    typedef expose_template_type< Useless<T> > this_type;
        
    expose_template_type()
    {
        if( !base_type::wrapped() )
        {
            boost::python::to_python_converter< Useless<T>, this_type >();
        }

    }

    static PyObject * convert( const Useless<T> & useless)
    {
        return boost::python::api::object_base_initializer( useless.inner );
    }
};


Useless<int> ATest()
{
    Useless<int> a;
    a.inner = 12;
    return a;
}

Useless<std::string> BTest()
{
    Useless<std::string> a;
    a.inner = "hello world";
    return a;
}

Useless<std::string> CTest()
{
    Useless<std::string> a;
    a.inner = "cruel world";
    return a;
}
